草庐IT

C++ 运算符 [] 魔法

全部标签

c++ - 如何将具有 "deleted"复制构造函数和赋值运算符的类放入映射中?

因为我使用的是一个不完全是C++11的编译器(VS11),所以我收到一个关于防止使用复制构造函数和赋值运算符的链接器错误。一切都很好,但问题是我不能将我的类放在std::map中,其中键是uin32_t,值是我的类。我什至尝试了emplace,但它不起作用。我正在考虑std::move将unique_ptr放入map中,但不想重新设计容器。那么有没有什么优雅的方法可以做到这一点(优雅==不像在map中放置一个虚拟对象然后在值内存中放置新的:)?代码位是这样的:std::mapm_map;//declarednotdefinedpublic:LogFileWriter(constLogF

c++ - 链接++ 运算符

我注意到在C++中允许使用类似++++i的东西并将i递增2。但是,不允许使用i++++.为什么后者不允许,而前者可以? 最佳答案 后缀++的结果是纯右值。后缀++只能应用于可修改的左值。因此,您不能将后缀++应用于另一个后缀++的结果。这是有道理的,因为它需要一些对象来修改。运算符的结果只是一个值(操作数原始值的拷贝)-没有您可以修改的对象。另一方面,prefix++的结果是一个左值,它也期望一个左值作为它的操作数。因此,您可以将前缀++的结果传递给另一个++。将左值视为表示内存中的对象,将右值视为值(可能来自内存中的对象)可能会有

c++ - '非静态引用成员,不能使用默认赋值运算符'

当我尝试编译我的代码时出现此错误:非静态引用成员‘Timestep&Timestep::previousTimestep’,不能使用默认赋值运算符我创建了一个Problem,它创建了一个Timestep对此Timestep的引用应该存储在vectorsolution。此外,我想存储对前一个Timestep的引用-对于第一个Timestep来说,这将是对自身的引用......我读到,如果我在一个类中有const成员,我需要定义一个自己的运算符,我试图将其设置为相等。但是,从代码中删除了所有const元素,它仍然不起作用。有什么建议么?非常感谢。classProblem{public:vo

c++ - CString += 运算符性能问题

我正在处理一个较旧的MFC/C++项目,该项目使用MFC的CString解析大型文本文件。处理字符串的类。我注意到在解析过程中有很多小部分添加到一个整体的大CString对象中://'strContainer'=CString//'tag'=CStringofamuchsmallersizestrContainer+=L"";当strContainer变量达到某个更大的大小时,上面的运算符似乎会降低CString的整体性能。我假设发生这种情况是因为+=运算符经常重新分配内存。所以我很好奇,有什么办法可以改善这一点吗?PS1。我不知道预先分配结果字符串的大小。PS2。由于项目本身的复杂性

c++ - 特征向量数组的 vector 运算

我有一个二维特征数组,其中数组中的每个项目都是一个3元素特征向量(例如,表面上的速度场)。我想将二维数组的每个元素与一个3元素EigenRowVector相乘,有效地进行点积。Eigen::ArrayvelField(5,5);Eigen::Vector3dn;//...initialisationofnandvelFieldnotshownEigen::Arrayresult(5,5);result=n.transpose()*velField;这会产生编译错误YOUMIXEDDIFFERENTNUMERICTYPES。但是,如果我不分配结果,而只是计算它:n.transpose()

c++ - 为类存储指向另一个类的指针复制构造函数析构函数和赋值运算符

我是新来的,这是我的第一个问题。我对我的家庭作业有疑问。我被要求设计一个抽象类“Base”,它由类“Sub”继承(在作业中有sub1、sub2等,但我试图尽可能地缩小它的范围)。然后,我应该设计一个类“BasePtr”,它存储一个指向“Base”对象的指针。最后,baseptr:s将存储在std::vector中,并使用ostream_iterator和复制写入文件。然后应使用ifstream_iterator读取该文件,并将其存储在std::list中。我已经解决了上述问题,但在实现析构函数、复制构造函数和赋值运算符时遇到了一些问题(因为我在我的BasePtr类中动态分配内存,我相信

c++ - 重载运算符 << Boost Log

inlinestd::ostream&operator&vector){ptest{1,2,3};LOG_DEBUG_MESSAGE你好,我为std::vector重载了我的运算符boost/log/utility/formatting_ostream.hpp:710:19:error:cannotbind'boost::log::v2_mt_posix::basic_formatting_ostream::ostream_type{akastd::basic_ostream}'lvalueto'std::basic_ostream&&'strm.stream()/opt/gcc.4.

c++ - 为什么运算符的操作数需要是同一类型?

如果我有这样的东西:inti=123;floatf=123.1;if(f>i){}else{}i将被提升为float并且比较将变为if(float>float)。我的问题是为什么首先需要将int变量提升为float,是因为计算机比较两个普通数字比尝试比较容易吗找出每个数字的位代表什么,然后进行比较? 最佳答案 因为“没有数字”。计算机不比较数字,也不处理数字。他们使用并比较位模式。位模式代表数字的事实是由于我们用来将数字表示为位模式的“编码”。一旦我们选择了一种编码,对数字的操作就变成了对位模式的操作。一旦我们选择了另一种编码,对数

c++ - 三元运算符并通过常量引用延长临时对象的生命周期

看到之后alocalreference-to-constmayprolongthelifeofatemporary,我遇到了有条件地将本地常量引用绑定(bind)到函数参数或函数调用的临时结果的需要,即:classGizmo{//RuleofFivemembersimplemented};GizmoFrobnicate(constGizmo&arg);voidProcessGizmo(constGizmo&arg,boolfrobnicate){constFoo&local=frobnicate?Frobnicate(arg):arg;//Performsomeworkonlocal}

c++ - 可以原子地获取和运算的最大数据类型?

我想尝试使用类似这样的方法自动重置256位:#include#include#include#includeintmain(){std::array,10>updateArray;__m256iallZeros=_mm256_setzero_si256();updateArray[0].fetch_and(allZeros);}但是我得到关于没有fetch_and()元素的编译器错误。这是不可能的,因为256位类型太大而无法保证原子性吗?还有其他方法可以实现吗?我正在使用海湾合作委员会。如果不是,我可以自动重置的最大类型是什么-64位?编辑:任何AVX指令都可以原子地执行取指与操作吗?